package com.yupi.yurpc.proxy;

import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import lombok.extern.slf4j.Slf4j;

/**
 * Mock 服务代理（JDK 动态代理）
 * @program: yu-rpc
 * @description: Java Lotus
 * @author: spring
 * @create: 2024-10-23
 */
@Slf4j
public class MockServiceProxy implements InvocationHandler {

    /**
     * 调用代理
     * @return 代理对象
     * @throws Throwable 抛出异常
     */
    @Override
    public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {

        // 根据方法的返回值类型，生成特定的默认值对象
        Class<?> methodReturnType = method.getReturnType();
        log.info("mock invoke {}", method.getName());
        return getDefaultObject(methodReturnType);
    }

    /**
     * 生成指定类型的默认值对象（可自行完善默认值逻辑）
     * @param type 数据类型
     * @return 返回相关的类型的参数
     */
    private Object getDefaultObject(Class<?> type){
        /*
        通过 getDefaultObject 方法，根据代理接口的 class 返回不同的默认值，
        比如针对 boolean 类型返回 false、对象类型返回 null 等
         */

        //基本类型
        if (type.isPrimitive()){
            if (type==boolean.class){
                return false;
            }else if(type==short.class){
                return (short) 0;
            }else if(type==int.class){
                return 0;
            }else if(type==long.class){
                return 0L;
            }
        }
        //对象类型
        return null;
    }
}
